<--- %%NOBANNER%% --> plotcorr.sas
 BackForward

/*------------------<--- Start of Description -->--------------------\
| TO PRODUCE YX SCATTER PLOT WITH CORRELATION AND REGRESSION DATA    |
| APPENDED AT THE BOTTOM OF THE PAGE. THE MACRO CAN USE EITHER PLOT  |
| OR GPLOT. FOR GPLOT THE GRAPH CAN OPTIONALLY INCLUDE THE REGRESSION|
| LINE OF Y ON X ALONG WITH CONFIDENCE LIMITS FOR EITHER MEAN Y OR   |
| INDIVIDUAL PREDICTED Y'S.                                          |
|--------------------<--- End of Description -->---------------------|
|--------------------------------------------------------------------|
|--------------<--- Start of Files or Arguments Needed -->-----------|
| PARAMETERS: DATA=INPUT DATA SET CONTAINING Y & X VARS.             |
|             YVAR=VARIABLE TO PLOT ON VERTICAL AXIS.                |
|             XVAR=VARIABLE TO PLOT ON HORIZONTAL AXIS.              |
|             YAXIS=VAXIS, VREF AND VMINOR OPTIONS FROM PROC PLOT OR |
|                   GPLOT. THESE MUST BE ENCLOSED IN DOUBLE QUOTES IF|
|                   USED. FOR EXAMPLE,                               |
|                   YAXIS="VAXIS=10 TO 20 BY 1 VREF=15  VMINOR=1".   |
|             XAXIS=HAXIS, HREF AND HMINOR OPTIONS FROM PROC PLOT OR |
|                   GPLOT.                                           |
| THE FOLLOWING PARAMETERS APPLY ONLY FOR GPLOTS                     |
|             PTYPE=TYPE OF PLOT.  THIS MUST BE SET TO 'GPLOT' IF ONE|
|                   DESIRES A GRAPHICS PLOT, ELSE LEAVE IT BLANK FOR |
|                   A STANDARD LINE PRINTER PLOT.                    |
|             LINE=ALLOWS ONE TO INCLUDE THE REGRESSION LINE ON THE  |
|                  PLOT ALONG WITH CONFIDENCE LIMITS IF DESIRED.     |
|                  THIS IS ONLY APPLICABLE FOR GPLOT. SEE PAGE 69 OF |
|                  THE SAS/GRAPH USERS GUIDE(V5) FOR DETAILS.        |
|                  EXAMPLES ARE:                                     |
|                          LINE=RL       LINEAR REGN LINE ONLY.      |
|                          LINE=RLCLM95  LINEAR REGN WITH CONF.      |
|                                        LIMITS(95%) FOR MEAN Y.     |
|                          LINE=RLCLI95  LINEAR REGN WITH CONF.      |
|                                        LIMITS(95%) FOR INDIVID.    |
|                                        PREDICTED VALUES OF Y.      |
|                                                                    |
|             PLTDATA=OUTPUT GRAPHICS CATALOG FOR SAVING THE GPLOT   |
|                    GRAPH.                                          |
|---------------<--- End of Files or Arguments Needed -->------------|
|--------------------------------------------------------------------|
|----------------<--- Start of Example and Usage -->-----------------|
| Example:                                                           |
|   data one;                                                        |
|      do x=1 to 50;                                                 |
|      y=x2;                                                         |
|      output;                                                       |
|   end;                                                             |
|   %plotcorr(data=one,yvar=y,xvar=x,ptype=gplot,line=rlci95,        |
|             pltdata=graf);                                         |
|   run;                                                             |
|   quit;                                                            |
| Usage: %PLOTCORR(DATA=,YVAR=,XVAR=,YAXIS=,XAXIS=,                  |
|                PTYPE=,LINE=,PLTDATA=WORK);                         |
\-------------------<--- End of Example and Usage -->---------------*/
%MACRO PLOTCORR(DATA=,YVAR=,XVAR=,YAXIS=,XAXIS=,
                PTYPE=,LINE=,PLTDATA=WORK);
/*--------------------------------------------\
| Author:   EJB;                              |
| Created:  2/9/89;                           |
| Modified: 9/3/93;                           |
| Purpose:  PRODUCE Y*X SCATTER PLOT;         |
\--------------------------------------------*/
  DATA __A; SET &DATA(KEEP= &YVAR &XVAR );
   __Y=&YVAR;
   __X=&XVAR;
   IF __Y=. OR __X=. THEN DO; __Y=.; __X=.; END; **IF ONE IS MISSING
                                                   SET BOTH TO BLANK;
  PROC UNIVARIATE NOPRINT; VAR __Y __X;
   OUTPUT OUT=__B N=N MEAN=MEAN_Y MEAN_X STD=SD_Y SD_X
   MEDIAN=MED_Y MED_X MIN=MIN_Y MIN_X MAX=MAX_Y MAX_X;
  DATA _NULL_; SET __B;
   LENGTH _Y _X $8.;
   _Y=SYMGET('YVAR');
   _X=SYMGET('XVAR');
   _YA=SYMGET('YAXIS');
   _XA=SYMGET('XAXIS');
   _YA=COMPRESS(_YA,'"');
   _XA=COMPRESS(_XA,'"');
   CALL SYMPUT('YAXIS',_YA);
   CALL SYMPUT('XAXIS',_XA);
   CALL SYMPUT('YVAR',_Y);
   CALL SYMPUT('XVAR',_X);
   CALL SYMPUT('NUSE',PUT(N,6.) );
   CALL SYMPUT('MNY',PUT(MEAN_Y,BEST8.) );
   CALL SYMPUT('MNX',PUT(MEAN_X,BEST8.) );
   CALL SYMPUT('SDY',PUT(SD_Y,BEST8.) );
   CALL SYMPUT('SDX',PUT(SD_X,BEST8.) );
   CALL SYMPUT('MDY',PUT(MED_Y,BEST8.) );
   CALL SYMPUT('MDX',PUT(MED_X,BEST8.) );
   CALL SYMPUT('MIY',PUT(MIN_Y,BEST8.) );
   CALL SYMPUT('MAY',LEFT(PUT(MAX_Y,BEST8.)) );
   CALL SYMPUT('MIX',PUT(MIN_X,BEST8.) );
   CALL SYMPUT('MAX',LEFT(PUT(MAX_X,BEST8.)) );
  PROC CORR NOPRINT OUTP=__P OUTS=__S DATA=__A; VAR __Y; WITH __X;
  DATA __C; SET __P(IN=INP) __S(IN=INS); IF _N_=1 THEN SET __B;
   IF _TYPE_='CORR';                 ** First obs. is Pearson corr(__Y);
                                     ** 2nd obs. is Spearman corr(__Y);
   T= __Y*SQRT( (N-2)/(1-__Y**2) );  ** T statistic for test of r=0;
   DF=N-2;                           ** Degrees of freedom for T;
   R=ROUND(__Y,.0001);               ** r=corr. coeff. rounded;
   P=( 1-PROBT(ABS(T),DF) )*2;       ** p-value for test of r=0;
   P=ROUND(P, .0001);
   IF INP THEN DO;                   ** Regression stats;
       S2Y=(N-1)*SD_Y**2;                 **  Corrected ss for y;
       S2X=(N-1)*SD_X**2;                 **  Corrreted ss for x;
       RSQ=__Y**2;                        **  R-square;
       B=__Y*SD_Y/SD_X;                   **  Slope;
       A=MEAN_Y-B*MEAN_X;                 **  Intercept;
       RMSE=SQRT(((1-RSQ)*S2Y)/(N-2));    **  Square root MSE or Sy.x;
       SEB=RMSE*SQRT(1/S2X);              **  Est. SE slope;
       SEA=RMSE*SQRT(1/N + MEAN_X**2/S2X);**  Est. SE intercept;
       CALL SYMPUT('RHO',PUT(R,6.4   ) );
       CALL SYMPUT('PRHO',PUT(P,5.4  ) );
       CALL SYMPUT('B',PUT(B,BEST8.) );
       CALL SYMPUT('A',PUT(A,BEST8.) );
       CALL SYMPUT('SEB',PUT(SEB,BEST8.) );
       CALL SYMPUT('SEA',PUT(SEA,BEST8.) );
       CALL SYMPUT('SYX',PUT(RMSE,BEST8.) );
       CALL SYMPUT('RSQ',PUT(RSQ,5.4) );
   END;
   IF INS THEN DO;
       CALL SYMPUT('RHOS',PUT(R,6.4 ) );
       CALL SYMPUT('PRHOS',PUT(P,5.4) );
   END;
 %IF %UPCASE(&PTYPE)=GPLOT %THEN %DO;
  SYMBOL1 C=RED  V=PLUS I=&LINE;
  PROC GPLOT DATA=__A GOUT=&PLTDATA;
    PLOT &YVAR*&XVAR / &YAXIS &XAXIS;
 %END;
 %ELSE %DO;
  PROC  PLOT DATA=__A;
    PLOT &YVAR*&XVAR / &YAXIS &XAXIS;
 %END;
 %macro ftn(fn); footnote&fn .j=l .h=.7  %mend  ftn;
 %ftn(1) "DESC. STATS(N=&NUSE):   Mean      Std      Median      Range";
 %ftn(2) "        &YVAR(Y)    &MNY &SDY &MDY &MIY => &MAY             ";
 %ftn(3) "        &XVAR(X)    &MNX &SDX &MDX &MIX => &MAX             ";
 %ftn(4) "CORRELATIONS:       Pearson=&RHO(P=&PRHO)  Spearman=&RHOS(P=&P
RHOS)";
 %ftn(5) "REGRESSION(Y=A+BX):  S(Y.X)=&SYX          Rsquare=&RSQ";
 %ftn(6) "                     A(SE)=&A(&SEA)  B(SE)=&B(&SEB) ";
  RUN; quit;
  %ftn(1);
  PROC datasets; DELETE __A __B __C __P __S;  quit;
%MEND PLOTCORR;